package org.burning.crm.workbench.service.impl;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import org.burning.crm.commons.constants.Constant;
import org.burning.crm.commons.domain.ReturnObject;
import org.springframework.stereotype.Service;

import java.util.Arrays;

/**
 * 用于对接 AI 平台
 */
@Service
public class AiManager {

//    public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
//        Generation gen = new Generation();
//        Message systemMsg = Message.builder()
//                .role(Role.SYSTEM.getValue())
//                .content("You are a helpful assistant.")
//                .build();
//        Message userMsg = Message.builder()
//                .role(Role.USER.getValue())
//                .content("分析这些数据：{\n" +
//                        "    \"code\": \"1\",\n" +
//                        "    \"message\": \"success\",\n" +
//                        "    \"retData\": [\n" +
//                        "        {\n" +
//                        "            \"交易来源\": \"web下载\",\n" +
//                        "            \"数量\": 1\n" +
//                        "        },\n" +
//                        "        {\n" +
//                        "            \"交易来源\": \"其他来源\",\n" +
//                        "            \"数量\": 2\n" +
//                        "        },\n" +
//                        "        {\n" +
//                        "            \"交易来源\": \"合作伙伴\",\n" +
//                        "            \"数量\": 3\n" +
//                        "        },\n" +
//                        "        {\n" +
//                        "            \"交易来源\": \"聊天\",\n" +
//                        "            \"数量\": 1\n" +
//                        "        }\n" +
//                        "    ]\n" +
//                        "}")
//                .build();
//        GenerationParam param = GenerationParam.builder()
//                // 若没有配置环境变量，请用百炼API Key将下行替换为：.apiKey("sk-xxx")
//                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
//                // 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
//                .model("qwen-plus")
//                .messages(Arrays.asList(systemMsg, userMsg))
//                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
//                .build();
//        return gen.call(param);
//    }
//    public static void main(String[] args) {
//        try {
//            GenerationResult result = callWithMessage();
//            System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
//        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
//            System.err.println("错误信息："+e.getMessage());
//            System.out.println("请参考文档：https://help.aliyun.com/zh/model-studio/developer-reference/error-code");
//        }
//        System.exit(0);
//    }

    /**
     * 阿里云百炼大模型 qwen-plus
     * 这个方法会调用 AI 接口
     * @param content   你的问题
     * @return          分析结论
     */
    private GenerationResult callWithMessage(String content) throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("You are a helpful assistant.")
                .build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(content)
                .build();
        GenerationParam param = GenerationParam.builder()
                // 若没有配置环境变量，请用百炼API Key将下行替换为：.apiKey("sk-xxx")
//                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .apiKey("sk-3ffe0abf01214fcd806c1f840ee216f0")
                // 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        return gen.call(param);
    }

    /**
     * 通用的 AI 调用接口（不知道为啥要这样包装
     * @param content 你的问题
     * @return 包含结论的returnObject
     */
    public Object doChat(String content) {
        ReturnObject returnObject = new ReturnObject();

        try {
            // 这里调用 AI 接口，返回包含结论的 GenerationResult 结论对象
            GenerationResult result = callWithMessage(content);
            // 从结论对象获取 String 类型的分析结论：result.getOutput().getChoices().get(0).getMessage().getContent()
            String msg = result.getOutput().getChoices().get(0).getMessage().getContent();
            // 我们把字符串的结论保存到响应结果对象
            returnObject.setCode(Constant.RETURN_OBJECT_CODE_SUCCESS);
            returnObject.setMessage("分析成功");
            returnObject.setRetData(msg);
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            System.err.println("错误信息："+e.getMessage());
            System.out.println("请参考文档：https://help.aliyun.com/zh/model-studio/developer-reference/error-code");
            returnObject.setCode(Constant.RETURN_OBJECT_CODE_FAIL);
            returnObject.setMessage("调用失败");
        }

        return returnObject;
    }
}
